﻿using EMS.Model;
using GalaSoft.MvvmLight;
using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace EMS
{
    public class AppData : ObservableObject//实现了 INotifyPropertyChanged 接口，提供 ​​数据绑定​​ 的核心支持•	
                                           //AppData 主要用于存储全局配置、当前用户等全局信息
    {
        public static AppData Instance = new Lazy<AppData>(() => new AppData()).Value;//C# 中实现线程安全的单例模式（Singleton Pattern）的简洁写法​​，
                                                                                      //核心目的是确保 AppData 类在整个应用程序生命周期内仅有一个实例，并提供全局访问点
        public string systemName = "Cargo System";                                    //Lazy<AppData>​​封装延迟初始化逻辑，接受一个工厂委托() => new AppData() 用于创建实例
                                                                                      //Lazy<T> 是 C# 中用于实现​​延迟加载（Lazy Initialization）​​ 的泛型类，核心目的是推迟对象的创建或初始化，
        public string SystemName
        {
            get { return systemName; } // 获取当前用户
            set
            {
                // 如果新值与当前值相同，则不进行任何操作，避免不必要的通知
                if (systemName == value) return;
                systemName = value;
                RaisePropertyChanged();// 通知UI更新,当 CurrentUser 属性被赋值（如用户登录/登出）时，
                                                    // 会触发 RaisePropertyChanged 事件，通知所有绑定到该属性的 UI 控件刷新显示
                                                    //nameof(CurrentUser) 在编译时检查标识符是否存在，重命名时自动同步更新
            }

        }                                                                    //直到首次实际访问该对象。这种机制在优化性能、减少资源消耗和简化线程安全设计方面有显著作用
                                                                             //() => new AppData() 是一个 ​​Lambda 表达式​​，其核心作用是定义一个​​无参的匿名函数​​，
                                                                             //用于延迟创建 AppData 对象的实例。


        private Member member = new Member();

        public Member CurrentUser
		{
            get => member;  // 获取当前用户
            set 
			{
                if (member == value) return; // 如果新值与当前值相同，则不进行任何操作，避免不必要的通知
                member = value;
                RaisePropertyChanged("CurrentUser");// 通知UI更新,当 CurrentUser 属性被赋值（如用户登录/登出）时，
                                                          // 会触发 RaisePropertyChanged 事件，通知所有绑定到该属性的 UI 控件刷新显示
                                                          //nameof(CurrentUser) 在编译时检查标识符是否存在，重命名时自动同步更新
            }
            
        }
        /// <summary>   
        /// 
        /// 主窗口实例，用于在需要时访问主窗口的属性和方法
        /// </summary>
        public MainWindow MainWindow { get; set; } = null;

    }
}
